package Estructuras.Arboles;

/**
 *
 * @author humbertino
 */
public class ABB<type> {

    String impresor="";
    pointerABB<type> root= null;
    boolean permiso=true;
    public void add(String nick,type nuevo)
    {
        if(existe(nick,root)!=true)
        {
            pointerABB<type> in = new pointerABB<type>();
            //System.out.println("nuevo: "+nick);
            in.setNick(nick);
            in.setDatos(nuevo);
            root=insertar(root,in);
        }else{
            System.out.println("Usuario Existente.");
        }
    }

    pointerABB<type> insertar(pointerABB<type> raiz, pointerABB<type> entrante)
    {
        pointerABB<type> N1;
        pointerABB<type> nuevo=entrante;
        if(vacio(raiz))
        {
            raiz=entrante;
            System.out.println("Usuario Ingresado: "+nuevo.getNick());
            permiso=true;
        }else{
            if(nuevo.getNick().compareTo(raiz.getNick())==-1)
            {
                raiz.setIzquierda(insertar(raiz.getIzquierda(),nuevo));
            }else{
                if(nuevo.getNick().compareTo(raiz.getNick())==1)
                {
                    raiz.setDerecha(insertar(raiz.getDerecha(),nuevo));
                }else
                {
                    System.out.println("Usuario Existente."); permiso = false;
                }
            }
        }
        return raiz;
    }

    boolean vacio(pointerABB<type> R){
		return (R == null);
	}
    
    public boolean existe(String nick, pointerABB<type> finder)
    {
        pointerABB<type> aux = finder;
        boolean existe=false;
        while(aux!=null)
        {
             if(nick.equals(aux.getNick())==true)
             {
                existe=true;
                aux=null;
             }else{
                 if(nick.compareTo(aux.getNick())==1)
                 {
                     aux=aux.getDerecha();
                 }else{
                     aux=aux.getIzquierda();
                     if(aux==null)
                     {
                         existe=false;
                     }
                 }
             }
        }
        return existe;
    }

    public void postOrdenABB (pointerABB<type> Nodo){
		if (Nodo == null)
			return;
		else{
			postOrdenABB (Nodo.getIzquierda());
			postOrdenABB (Nodo.getDerecha());
                        System.out.print(Nodo.getNick()+",");
		}
	}

    public void inOrdenABB (pointerABB<type> Nodo){
		if (Nodo == null)
			return;
		else{
			inOrdenABB (Nodo.getIzquierda());
                        System.out.print(Nodo.getNick()+",");
			inOrdenABB (Nodo.getDerecha());
		}
	}

    public void preOrdenABB (pointerABB<type> Nodo)
    {
        if (Nodo == null)
			return;
		else{
                        System.out.print(Nodo.getNick()+",");
			preOrdenABB (Nodo.getIzquierda());
                        preOrdenABB (Nodo.getDerecha());
		}
    }
    
    public int size(pointerABB F)
    {
        int cont=0;
        if(F==null)
        {
         cont = cont;
        }else{
            cont = cont + 1 + size(F.getIzquierda()) + size(F.getDerecha());
        }
        return cont;
    }

    public pointerABB<type> getRoot() {
        return root;
    }

    public void setRoot(pointerABB<type> root) {
        this.root = root;
    }
    
    public int Altura(pointerABB<type> raiz)
    {
        if (raiz == null)
		return 0;
		else
		return	1 + Math.max(Altura(raiz.getIzquierda()), Altura(raiz.getDerecha()));
    }
    
}
